package design.single;

//懒汉模式
//在多线程情况下会有问题
public class LazyMan {

    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"ok");
        System.out.println(lazyMan);
    }

    private volatile static LazyMan lazyMan;

    //双重检测锁模式的懒汉式单例
    public static LazyMan getInstance(){
        if(lazyMan == null){
            synchronized (LazyMan.class){
                if(lazyMan == null){
                    lazyMan = new LazyMan();    //new一个实例不是一个原子性操作
                }
            }
        }
        return lazyMan;
    }

    public static void main(String[] args) {
        for(int i = 0;i<10;i++){
            new Thread(()->{
                LazyMan.getInstance();
            }).start();
        }
    }
}


/**
 * 注意new对象时，不是一个原子性操作
 * new对象时，更底层可分为三部
 * 1、分配内存空间
 * 2、执行构造方法，初始化对象
 * 3、把这个对象指向这个空间
 */